import { ExecutionContext } from "@nestjs/common";

/**
 * 从上下文中获取响应头
 *
 * @param {ExecutionContext} context 上下文
 * @returns {HeadersInit} 响应头
 */
export const getResHeadersFromContext = (context: ExecutionContext): HeadersInit => {
  return context.switchToHttp().getResponse().getHeaders();
};

/**
 * 从上下文中获取指定的响应头
 *
 * @param {ExecutionContext} context 上下文
 * @param {string} headerKey 响应头键
 * @returns {string | undefined} 响应头值
 */
export const getResHeaderFromContext = (context: ExecutionContext, headerKey: string): string | undefined => {
  return context.switchToHttp().getResponse().getHeader(headerKey)
}

/**
 * 通过上下文对象修改响应头
 *
 * @param {ExecutionContext} context 上下文
 * @param {string} headerKey 响应头键
 * @param {string} headerValue 响应头值
 */
export const modifyResHeadersByContext = (context: ExecutionContext, headerKey: string, headerValue: string): void => {
  context.switchToHttp().getResponse().setHeader(headerKey, headerValue);
}

/**
 * 修改响应数据
 *
 * @param res 响应对象
 * @param {(resData: any) => any} resDataModifyHandler 对响应数据进行修改的处理函数，该处理函数接收响应数据作为参数，且该处理函数必须
 * 返回修改后的响应数据
 */
export const modifyResData = (res: any, resDataModifyHandler: (resData: any) => any) => {
  // 暂存响应对象中的原 send 方法
  const originalSend = res.send.bind(res);
  // 重写 send 方法
  res.send = function (body?: any): Response {
    // 获取 JSON 解析后的响应数据
    let resData = JSON.parse(body);
    // 调用对响应数据进行修改的处理函数
    resData = resDataModifyHandler(resData);
    // 调用原 send 方法，向客户端返回进行修改处理后的响应数据
    return originalSend(JSON.stringify(resData));
  };
}